/**
 * 分数管理器
 * 负责计算游戏得分
 */
class ScoreManager {
    constructor() {
        // 基础分数系数
        this.baseScoreMultiplier = 100;
        
        // 难度系数
        this.difficultyMultipliers = {
            easy: 0.8,
            medium: 1.0,
            hard: 1.5
        };
        
        // 正确率权重
        this.accuracyWeight = 0.3;
        
        // 速度权重
        this.speedWeight = 0.5;
        
        // 时间权重
        this.timeWeight = 0.2;
    }
    
    /**
     * 计算最终得分
     * @param {number} wpm 平均打字速度
     * @param {number} accuracy 正确率
     * @param {number} time 游戏时间(秒)
     * @param {string} difficulty 游戏难度
     * @param {boolean} completed 是否完成文本
     * @returns {number} 最终得分
     */
    calculateFinalScore(wpm, accuracy, time, difficulty = 'medium', completed = false) {
        // 获取难度系数
        const difficultyMultiplier = this.difficultyMultipliers[difficulty] || 1.0;
        
        // 计算速度得分
        const speedScore = wpm * this.speedWeight;
        
        // 计算正确率得分 (正确率低于50%不得分)
        const accuracyScore = Math.max(0, (accuracy - 50) / 50) * 100 * this.accuracyWeight;
        
        // 计算时间得分 (最多得分为100)
        const timeScore = Math.min(100, time / 10) * this.timeWeight;
        
        // 计算基础得分
        let baseScore = (speedScore + accuracyScore + timeScore) * this.baseScoreMultiplier;
        
        // 应用难度系数
        baseScore *= difficultyMultiplier;
        
        // 如果完成文本，额外奖励
        if (completed) {
            baseScore *= 1.5;
        }
        
        // 四舍五入到整数
        return Math.round(baseScore);
    }
    
    /**
     * 计算实时得分
     * @param {number} wpm 当前打字速度
     * @param {number} accuracy 当前正确率
     * @param {number} time 当前游戏时间(秒)
     * @param {string} difficulty 游戏难度
     * @returns {number} 实时得分
     */
    calculateCurrentScore(wpm, accuracy, time, difficulty = 'medium') {
        // 简化版的得分计算，用于实时显示
        const difficultyMultiplier = this.difficultyMultipliers[difficulty] || 1.0;
        
        // 计算简化得分
        const score = (wpm * 0.6 + accuracy * 0.4) * difficultyMultiplier;
        
        return Math.round(score);
    }
} 